Skip to content

ci: add the manual Windows prerelease workflow - #550

Merged
hcoona merged 4 commits into
main-v2from
feat/windows-release-workflow
Oct 30, 2026
Merged

hcoona merged 4 commits into
main-v2from
feat/windows-release-workflow

Conversation

@hcoona

@hcoona hcoona commented Oct 29, 2026 •

Copy link
Copy Markdown
Owner

Summary

Implements delegated items 1 and 2 of the Delivery Wave entry "Windows 0.1.0-alpha Prereleases" (merged in #549): the manual release workflow and the record updates. No prerelease is created by this PR; the first run happens after merge, followed by the item 3 release review and the owner's publication.

Authorization and Governing Records

Scope and Non-Goals

  • Workflow .github/workflows/release.yml: workflow_dispatch only; refuses any ref but refs/heads/main-v2; permissions: {} at the top and per-job tokens (build contents: read; attest id-token: write, attestations: write; draft contents: write); actions pinned by SHA (checkout and mise-action as in check.yml; upload-artifact v7.0.2, download-artifact v8.0.2, attest-build-provenance v4.2.2); no tool cache restored; scenarios with TestCategory!=WindowsHostTiming; package.ps1 without development switches; build-info.json with runner image, .NET SDK, Visual Studio, MSVC, link.exe and Windows SDK versions; artifacts with retention-days: 1; draft verifies checksums and the recorded commit, refuses an existing tag or release, and creates v<version> targeting the built commit with both zips and .sha256 files.
  • Records: project posture, registry (tag scheme, symbols archive), Windows design (Release Workflow section; build-chain sentence per the owner decision), validation strategy (Primary Journey Gate wording, CI section, release note), user stories, threat model build/CI-token row (.tm7 unchanged), a windows-release-workflow control at the release execution point, READMEs, CONTRIBUTING.md, and conversion of the completed host-test record, family (portable-package-host-test-evidence) and index row.
  • Not in scope: running the workflow; the release review; signing; any product or dependency change.

Record-System Impact

Changed families: workflows, project policy, operational-identity registry, design records, validation strategy, product user stories, threat model, control catalog (new control), record-family catalog (family renamed and its concern and consumers updated), research evidence, contributor interface, portal and landing.

Evidence and Reasoning

  • Attestation permissions follow the actions/attest documentation (id-token: write for the Sigstore OIDC token, attestations: write to persist); artifact-metadata: write is needed only for registry storage records, which this workflow does not create.
  • The build-info step reads versions from vswhere, Microsoft.VCToolsVersion.default.txt, link.exe's version resource and the Windows Kits Lib directories; it records all installed SDK versions because MSBuild selects the newest by default.

Identity and Security Effects

No product change. The workflow's write permissions are split per job; no job persists checkout credentials.

Validation

  • actionlint and hk check --all passed.
  • The workflow cannot be exercised before merge (workflow_dispatch runs from the default branch); its first run after merge is the first evidence, reviewed under item 3.

Review and Disposition

Accepted target-branch authorities used: origin/main-v2 (2e0f736) AGENTS.md, governance policies and catalogs, the Wave entry and its owner dispositions in #549, the experiment policy, and both review Skills. This PR adds a control (windows-release-workflow) and renames a record family (portable-package-host-test-protocol to portable-package-host-test-evidence); the owner's merge accepts both.

  • Independent review (rv_wave_pkg) on 4227526: no blocking findings; six advisories.
  • Independent triage (tr_wave_pkg): all true positive, no owner decision needed. Fixed in 87975c2:
    • RS-W1 (design weakened the general build-chain rule): general rule kept as "must pin"; the floating chain is the 0.1.0-alpha exception only; the local-build sentence dropped.
    • RS-W2 (main-v2 guard only in the main-v2 copy): design, threat model and control now say so; the release review checks the run's and attestation's source ref and workflow.
    • RS-W3 (present tense): prereleases "may be published".
    • RE-W1 (recorded chain is the installed chain): vswhere -prerelease as ILCompiler; the record is labeled an inference.
    • Code (tag/release check failed open): only HTTP 404 means absent; drafts for the version are also refused.
    • Recheck evidence: recorded below.
  • Rechecks (2026-10-29): RECHECK-007 fires (client-profile: this PR implements public distribution of the bundled Profile). The Azure DevOps Entra OAuth guidance is unchanged (updated 2026-05-08T17:05:00Z, f7bd73f); the evidence stays bounded existing-state (docs(research): record the portable package host test results #548); the external Client Profile gate stays open under decision 0003's prerelease exception; no conclusion changes. RECHECK-008 does not fire (publishing mode, target and pins unchanged; the floating hosted chain is the owner's RS-2 decision). RECHECK-001, 002, 003, 004, 006, 009, 010 fire only at each prerelease and belong to the item 3 release review. RECHECK-005 does not fire.
  • Re-review on 87975c2: all six resolved; one advisory: the draft-count pipeline ran under GitHub's default bash -e without pipefail, so a failed lookup counted as zero drafts. Triage: true positive (8/10), no owner decision. Fixed in 783ff34 (shell: bash, which runs -eo pipefail; control invariant names the draft refusal).
  • Re-review on 783ff34: resolved; no material findings under either Skill.
  • Owner decision needed: merge (Record-System Gate), accepting the new windows-release-workflow control and the family rename.

Upstream Provenance

None.

Add .github/workflows/release.yml as the Wave entry "Windows 0.1.0-alpha
Prereleases" authorizes. It starts only by hand and refuses any ref but
main-v2, and splits the token by job:

- build (contents: read) restores in locked mode with the pinned SDK,
  runs the Windows scenarios without WindowsHostTiming, runs
  package.ps1 without its development switches, and records the runner
  image and native build chain in build-info.json and the run summary;
- attest (id-token and attestations: write) attests both zips;
- draft (contents: write) verifies the checksums and commit, refuses an
  existing tag or release, and creates a draft prerelease targeting
  the built commit with both zips and their checksums.

Artifacts between jobs expire after one day. Actions are pinned by SHA.

Refs: #506
- Project posture: unsupported 0.1.0-alpha prereleases are published.
- Registry: the tag scheme v<version> and the symbols archive.
- Windows design: a Release Workflow section, and the build-chain
  sentence now allows the owner-accepted floating hosted chain with
  recorded versions.
- Validation strategy and user stories: the primary journey blocks the
  first supported, non-prerelease release; the release run's scenario
  filter and claim limits.
- Threat model: the release workflow's per-job token and attestation in
  the build and CI-token row; the .tm7 is unchanged.
- Controls: a windows-release-workflow control at the release point.
- READMEs and CONTRIBUTING: prereleases and the shared MISE_VERSION.
- Convert the completed host test record, its record family and its
  index row into completed evidence.

Refs: #506, #482
- Keep "must pin" as the general build-chain rule and state the
  owner's floating-chain decision as the 0.1.0-alpha exception only;
  drop the unrequested local-build rule (RS-W1).
- Say that only the main-v2 copy of the workflow refuses other refs,
  and have the release review check the run's and attestation's source
  ref and workflow, in the design, threat model and control (RS-W2).
- Describe prereleases as ones that may be published (RS-W3).
- Find Visual Studio with vswhere -prerelease as ILCompiler does, and
  label the recorded chain as the installed chain the linker is
  inferred to use (RE-W1).
- Treat only HTTP 404 as an absent tag or release, fail on any other
  error, and also refuse an existing draft for the version.

Refs: #506
The step that refuses an existing version ran under GitHub's default
bash -e without pipefail, so a failed paginated draft lookup counted
as zero drafts. Run it with shell: bash (-eo pipefail), and name the
draft refusal in the control's invariant.

Refs: #506
@hcoona
hcoona merged commit c3258d1 into main-v2 Oct 30, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant